Complex computer processing tasks rely on computing systems to closely monitor themselves and adapt to changing conditions to optimize their performance. This is often called “Autonomic Computing.” A fundamental problem for such systems is to determine when to adapt and what to adapt to. Although many heuristics have been given, a generic technique is lacking.
In particular, many complex computer processing tasks that have high computing resource requirements, such as querying massive databases having millions of records, may be broken into several smaller tasks that can be processed in parallel in a distributed manner by multiple computer processors. However, load imbalances among parallel processors, particularly where the processors are not dedicated to the same distributed tasks, may result in overall processing inefficiencies. One solution is to send subsequent tasks to the processors with the most available processing power. This approach works well when the tasks are relatively simple and can be completed quickly. However, when the tasks are complex, this approach does not alleviate an already over-utilized processor that may be holding up computations further down the pipeline. Another approach is to migrate currently-processing tasks from over-utilized processors to processors with available processing power. As in the case above, this may work well if the task is relatively small and has a small amount of data associated with it. However, if the task is complex or has a large amount of data associated with it, migrating the task may result in less overall processing efficiency than if the task is not migrated. An efficient adaptive computing strategy would therefore be advantageous.